<!DOCTYPE html><html><head>
<title>page_util_peg - Parser generator tools</title>
<style type="text/css"><!--
    HTML {
	background: 	#FFFFFF;
	color: 		black;
    }
    BODY {
	background: 	#FFFFFF;
	color:	 	black;
    }
    DIV.doctools {
	margin-left:	10%;
	margin-right:	10%;
    }
    DIV.doctools H1,DIV.doctools H2 {
	margin-left:	-5%;
    }
    H1, H2, H3, H4 {
	margin-top: 	1em;
	font-family:	sans-serif;
	font-size:	large;
	color:		#005A9C;
	background: 	transparent;
	text-align:		left;
    }
    H1.doctools_title {
	text-align: center;
    }
    UL,OL {
	margin-right: 0em;
	margin-top: 3pt;
	margin-bottom: 3pt;
    }
    UL LI {
	list-style: disc;
    }
    OL LI {
	list-style: decimal;
    }
    DT {
	padding-top: 	1ex;
    }
    UL.doctools_toc,UL.doctools_toc UL, UL.doctools_toc UL UL {
	font:		normal 12pt/14pt sans-serif;
	list-style:	none;
    }
    LI.doctools_section, LI.doctools_subsection {
	list-style: 	none;
	margin-left: 	0em;
	text-indent:	0em;
	padding: 	0em;
    }
    PRE {
	display: 	block;
	font-family:	monospace;
	white-space:	pre;
	margin:		0%;
	padding-top:	0.5ex;
	padding-bottom:	0.5ex;
	padding-left:	1ex;
	padding-right:	1ex;
	width:		100%;
    }
    PRE.doctools_example {
	color: 		black;
	background: 	#f5dcb3;
	border:		1px solid black;
    }
    UL.doctools_requirements LI, UL.doctools_syntax LI {
	list-style: 	none;
	margin-left: 	0em;
	text-indent:	0em;
	padding:	0em;
    }
    DIV.doctools_synopsis {
	color: 		black;
	background: 	#80ffff;
	border:		1px solid black;
	font-family:	serif;
	margin-top: 	1em;
	margin-bottom: 	1em;
    }
    UL.doctools_syntax {
	margin-top: 	1em;
	border-top:	1px solid black;
    }
    UL.doctools_requirements {
	margin-bottom: 	1em;
	border-bottom:	1px solid black;
    }
--></style>
</head>
<!-- Generated from file 'page_util_peg.man' by tcllib/doctools with format 'html'
   -->
<!-- Copyright &amp;copy; 2007 Andreas Kupries &amp;lt;andreas_kupries@users.sourceforge.net&amp;gt;
   -->
<!-- page_util_peg.n
   -->
<body><hr> [
   <a href="../../../../../../../../home">Tcllib Home</a>
&#124; <a href="../../../../toc.html">Main Table Of Contents</a>
&#124; <a href="../../../toc.html">Table Of Contents</a>
&#124; <a href="../../../../index.html">Keyword Index</a>
&#124; <a href="../../../../toc0.html">Categories</a>
&#124; <a href="../../../../toc1.html">Modules</a>
&#124; <a href="../../../../toc2.html">Applications</a>
 ] <hr>
<div class="doctools">
<h1 class="doctools_title">page_util_peg(n) 1.0 tcllib &quot;Parser generator tools&quot;</h1>
<div id="name" class="doctools_section"><h2><a name="name">Name</a></h2>
<p>page_util_peg - page PEG transformation utilities</p>
</div>
<div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2>
<ul class="doctools_toc">
<li class="doctools_section"><a href="#toc">Table Of Contents</a></li>
<li class="doctools_section"><a href="#synopsis">Synopsis</a></li>
<li class="doctools_section"><a href="#section1">Description</a></li>
<li class="doctools_section"><a href="#section2">API</a></li>
<li class="doctools_section"><a href="#section3">Bugs, Ideas, Feedback</a></li>
<li class="doctools_section"><a href="#keywords">Keywords</a></li>
<li class="doctools_section"><a href="#category">Category</a></li>
<li class="doctools_section"><a href="#copyright">Copyright</a></li>
</ul>
</div>
<div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2>
<div class="doctools_synopsis">
<ul class="doctools_requirements">
<li>package require <b class="pkgname">page::util::peg <span class="opt">?0.1?</span></b></li>
<li>package require <b class="pkgname">snit</b></li>
</ul>
<ul class="doctools_syntax">
<li><a href="#1"><b class="cmd">::page::util::peg::symbolNodeOf</b> <i class="arg">tree</i> <i class="arg">node</i></a></li>
<li><a href="#2"><b class="cmd">::page::util::peg::symbolOf</b> <i class="arg">tree</i> <i class="arg">node</i></a></li>
<li><a href="#3"><b class="cmd">::page::util::peg::updateUndefinedDueRemoval</b> <i class="arg">tree</i></a></li>
<li><a href="#4"><b class="cmd">::page::util::peg::flatten</b> <i class="arg">treequery</i> <i class="arg">tree</i></a></li>
<li><a href="#5"><b class="cmd">::page::util::peg::getWarnings</b> <i class="arg">tree</i></a></li>
<li><a href="#6"><b class="cmd">::page::util::peg::printWarnings</b> <i class="arg">msg</i></a></li>
<li><a href="#7"><b class="cmd">::page::util::peg::peOf</b> <i class="arg">tree</i> <i class="arg">eroot</i></a></li>
<li><a href="#8"><b class="cmd">::page::util::peg::printTclExpr</b> <i class="arg">pe</i></a></li>
</ul>
</div>
</div>
<div id="section1" class="doctools_section"><h2><a name="section1">Description</a></h2>
<p>This package provides a few common operations to PEG transformations.
They assume a <i class="term">Normalized PE Grammar Tree</i> as input, see the
package <b class="package">page::util::norm::peg</b>, possibly augmented with
attributes coming from transformations not in conflict with the base
definition.</p>
</div>
<div id="section2" class="doctools_section"><h2><a name="section2">API</a></h2>
<dl class="doctools_definitions">
<dt><a name="1"><b class="cmd">::page::util::peg::symbolNodeOf</b> <i class="arg">tree</i> <i class="arg">node</i></a></dt>
<dd><p>Given an arbitrary expression <i class="arg">node</i> in the AST <i class="arg">tree</i> it
determines the node (itself or an ancestor) containing the name of the
nonterminal symbol the node belongs to, and returns its id. The result
is either the root of the tree (for the start expression), or a
definition node.</p></dd>
<dt><a name="2"><b class="cmd">::page::util::peg::symbolOf</b> <i class="arg">tree</i> <i class="arg">node</i></a></dt>
<dd><p>As <b class="cmd">::page::util::peg::symbolNodeOf</b>, but returns the symbol name
instead of the node.</p></dd>
<dt><a name="3"><b class="cmd">::page::util::peg::updateUndefinedDueRemoval</b> <i class="arg">tree</i></a></dt>
<dd><p>The removal of nodes in the AST <i class="arg">tree</i> can cause symbols to lose
one or more users.</p>
<pre class="doctools_example">
	A used by B and C,
	B is reachable,
	C is not,
	so A now loses the node in the expression for C calling it,
	or rather, not calling it anymore.
</pre>
<p>This command updates the cross-references and which nonterminals are
now undefined.</p></dd>
<dt><a name="4"><b class="cmd">::page::util::peg::flatten</b> <i class="arg">treequery</i> <i class="arg">tree</i></a></dt>
<dd><p>This commands flattens nested sequence and choice operators in the AST
<i class="arg">tree</i>, re-using the <b class="package"><a href="../treeql/treeql.html">treeql</a></b> object <i class="arg">treequery</i> to
run the query determining which nodes to cut.</p></dd>
<dt><a name="5"><b class="cmd">::page::util::peg::getWarnings</b> <i class="arg">tree</i></a></dt>
<dd><p>This command looks at the attributes of the AST <i class="arg">tree</i> for
problems with the grammar and issues warnings. They do not prevent us
from writing the grammar, but still represent problems with it the
user should be made aware of.</p>
<p>The result of the command is a dictionary mapping nonterminal names to
their associated warnings.</p></dd>
<dt><a name="6"><b class="cmd">::page::util::peg::printWarnings</b> <i class="arg">msg</i></a></dt>
<dd><p>The argument of the command is a dictionary mapping nonterminal names
to their associated warnings, as generated by, for example, the
command <b class="cmd">::page::util::peg::getWarnings</b>.</p>
<p>The warnings contained therein are formatted and then printed via the
log command <b class="cmd">page_info</b>. This means that this command can be used
only from within a plugin managed by the package
<b class="package">page::pluginmgr</b>.</p></dd>
<dt><a name="7"><b class="cmd">::page::util::peg::peOf</b> <i class="arg">tree</i> <i class="arg">eroot</i></a></dt>
<dd><p>This command converts the parsing expression starting at the node
<i class="arg">eroot</i> in the AST <i class="arg">tree</i> into a nested list. The exact syntax
of this list specified by the package <b class="package"><a href="../grammar_peg/peg.html">grammar::peg</a></b>.</p></dd>
<dt><a name="8"><b class="cmd">::page::util::peg::printTclExpr</b> <i class="arg">pe</i></a></dt>
<dd><p>This command converts the parsing expression contained in the nested
list <i class="arg">pe</i> into a Tcl string which can be placed into a Tcl script.
See the package <b class="package"><a href="../grammar_peg/peg.html">grammar::peg</a></b> for the exact syntax of
<i class="arg">pe</i>.</p></dd>
</dl>
</div>
<div id="section3" class="doctools_section"><h2><a name="section3">Bugs, Ideas, Feedback</a></h2>
<p>This document, and the package it describes, will undoubtedly contain
bugs and other problems.
Please report such in the category <em>page</em> of the
<a href="http://core.tcl.tk/tcllib/reportlist">Tcllib Trackers</a>.
Please also report any ideas for enhancements you may have for either
package and/or documentation.</p>
<p>When proposing code changes, please provide <em>unified diffs</em>,
i.e the output of <b class="const">diff -u</b>.</p>
<p>Note further that <em>attachments</em> are strongly preferred over
inlined patches. Attachments can be made by going to the <b class="const">Edit</b>
form of the ticket immediately after its creation, and then using the
left-most button in the secondary navigation bar.</p>
</div>
<div id="keywords" class="doctools_section"><h2><a name="keywords">Keywords</a></h2>
<p><a href="../../../../index.html#peg">PEG</a>, <a href="../../../../index.html#page">page</a>, <a href="../../../../index.html#parser_generator">parser generator</a>, <a href="../../../../index.html#parsing_expression_grammar">parsing expression grammar</a>, <a href="../../../../index.html#text_processing">text processing</a>, <a href="../../../../index.html#transformation">transformation</a></p>
</div>
<div id="category" class="doctools_section"><h2><a name="category">Category</a></h2>
<p>Page Parser Generator</p>
</div>
<div id="copyright" class="doctools_section"><h2><a name="copyright">Copyright</a></h2>
<p>Copyright &copy; 2007 Andreas Kupries &lt;andreas_kupries@users.sourceforge.net&gt;</p>
</div>
</div></body></html>
